#include <Wire.h>

void setup() {
  Wire.begin();
  // 初始化 ADXL345
  Wire.beginTransmission(0x53); // ADXL345 I2C 地址为 0x53
  Wire.write(0x2D); // 设置寄存器为配置寄存器
  Wire.write(0x08); // 将配置寄存器设置为默认值
  Wire.endTransmission();
}

void readAcceleration(int16_t* x, int16_t* y, int16_t* z) {
  Wire.beginTransmission(0x53); // ADXL345 I2C 地址为 0x53        
  Wire.write(0x32); // 设置寄存器为 X 轴加速度寄存器
  Wire.endTransmission(false);
  Wire.requestFrom(0x53, 6); // 读取 6 个字节的数据
  *x = Wire.read() | (Wire.read() << 8);
  *y = Wire.read() | (Wire.read() << 8);
  *z = Wire.read() | (Wire.read() << 8);
}

void calculateSteps() {
  int16_t x, y, z;
  readAcceleration(&x, &y, &z);

  // 计算合加速度
  float accelerationMagnitude = sqrt(x * x + y * y + z * z);

  // 设置步数阈值
  float stepThreshold = 1.2; // 根据实际情况调整阈值

  // 检测步数
  static int stepCount = 0;
  static bool isStepDetected = false;

  if (accelerationMagnitude > stepThreshold && !isStepDetected) {
    stepCount++;
    isStepDetected = true;
  }
  else if (accelerationMagnitude < stepThreshold) {
    isStepDetected = false;
  }

  // 打印步数
  Serial.print("步数: ");
  Serial.println(stepCount);
}

void loop() {
  calculateSteps();
  delay(1000);
}